#include <iostream>
#include <map>

typedef void (*HANDLE_FUN)();
std::map<std::string, HANDLE_FUN> gMapFun;

#define ADD(cmd, fun)           \
{                               \
    extern void fun();          \
    gMapFun.emplace(cmd, fun);  \
}

void AddMapFun() {
    ADD("list",            HandleList);
    ADD("dlist",           HandleDList);
    ADD("tree",            HandleTree);
    ADD("tcmalloc",        HandleTcmalloc);
    ADD("heap",            HandleHeap);
    ADD("heap2",           HandleHeap2);
    ADD("ptr",             HandlePtr);
    ADD("scene",           HandleScene);
    ADD("binary_search",   HandleBinarySearch);
    ADD("trie",            HandleTrie);
    ADD("graph",           HandleGraph);
    ADD("backtrack",       HandleBacktrack);
    ADD("dp",              HandleDp);
    ADD("slide_window",    HandleSlideWindow);
    ADD("resource_owner",  HandleResourceOwner);
    ADD("reverse_cake",    HandleReverseCake);
    ADD("floodfill",       HandleFloodFill);
    ADD("bfs",             HandleBfs);
    ADD("week_ptr",        HandleWeekPtr);
    ADD("stock",           HandleStock);
    ADD("unique_ptr",      HandleUniquePtr);
    ADD("vptr",            HandleVPtr);
    ADD("thread",          HandleThread);
    ADD("condition",       HandleCondition);
    ADD("mutex",           HandleMutex);
    ADD("zuhe",            HandleZuhe);
    ADD("spdlog",          HandleSpdlog);
    ADD("http",            HandleHttp);
    ADD("threadpool",      HandleThreadPool);
    ADD("sort",            HandleSort);
    ADD("traits",          HandleTraits);
}

int main(int argc, char *argv[]) {
    AddMapFun();
    for (int i=0; i<argc; ++i) {
        std::string arg = argv[i];
        auto search = gMapFun.find(arg);
        if (search != gMapFun.end()) {
            (search->second)();
        }
    }
    return 0;
}
